{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Building a simple neural-network with Keras\n",
    "\n",
    "**Author: Xavier Snelgrove**\n",
    "\n",
    "This is a simple quick-start in performing digit recognition in a neural network in Keras, for a short tutorial at the University of Toronto. It is largely based on the `mnist_mlp.py` example from the Keras source.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Install prerequisites\n",
    "First steps (instructions for Mac or Linux). You need to install a recent version of Python, plus the packages `keras`, `numpy`, `matplotlib` and `jupyter`.\n",
    "\n",
    "### Install a recent Python\n",
    "\n",
    "If you haven't installed a recent Python I recommend installing via Homebrew on a Mac from http://brew.sh and then installing Python via `brew install python`.\n",
    "\n",
    "\n",
    "### Configure a virtual environment\n",
    "\n",
    "You can install the packages globally, but I suggest installing them in a `virtualenv` virtual environment that basically encapsulates a full isolated Python environment. First you'll need to install a Python package manager called `pip` thus:\n",
    "\n",
    "    easy_install pip\n",
    "    \n",
    "(If you get a permissions error, try adding a `sudo` to the beginning, so `sudo easy_install pip`)\n",
    "\n",
    "Now install virtualenv thus:\n",
    "\n",
    "    pip install virtualenv\n",
    "\n",
    "Navigate to your home directory `cd ~` and create a virtual environment. We'll call it `kerasenv`\n",
    "\n",
    "    virtualenv kerasenv\n",
    "\n",
    "Now, to switch your shell environment to be within the env:\n",
    "\n",
    "    source kerasenv/bin/activate\n",
    "    \n",
    "Great: now you can install the other prerequisites into this environment.\n",
    "\n",
    "    pip install numpy jupyter keras matplotlib\n",
    "    \n",
    "\n",
    "## Open a new notebook\n",
    "\n",
    "Now that everything's installed, you can open one of these web-based Python environments with the following command:\n",
    "\n",
    "    ipython notebook\n",
    "    \n",
    "Create a new Python notebook from the \"New\" menu at the top-right:\n",
    "\n",
    "<img src=\"newnotebook.png\">\n",
    "\n",
    "You should now be able to run Python in your browser!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Time to build a neural network!\n",
    "First let's import some prerequisites"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['figure.figsize'] = (7,7) # Make the figures a bit bigger\n",
    "\n",
    "from keras.datasets import mnist\n",
    "from keras.models import Sequential\n",
    "from keras.layers.core import Dense, Dropout, Activation\n",
    "from keras.utils import np_utils"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load training data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train original shape (60000, 28, 28)\n",
      "y_train original shape (60000,)\n"
     ]
    }
   ],
   "source": [
    "nb_classes = 10\n",
    "\n",
    "# the data, shuffled and split between tran and test sets\n",
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "print(\"X_train original shape\", X_train.shape)\n",
    "print(\"y_train original shape\", y_train.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's look at some examples of the training data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x504 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for i in range(9):\n",
    "    plt.subplot(3,3,i+1)\n",
    "    plt.imshow(X_train[i], cmap='gray', interpolation='none')\n",
    "    plt.title(\"Class {}\".format(y_train[i]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Format the data for training\n",
    "Our neural-network is going to take a single vector for each training example, so we need to reshape the input so that each 28x28 image becomes a single 784 dimensional vector. We'll also scale the inputs to be in the range [0-1] rather than [0-255]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training matrix shape (60000, 784)\n",
      "Testing matrix shape (10000, 784)\n"
     ]
    }
   ],
   "source": [
    "X_train = X_train.reshape(60000, 784)\n",
    "X_test = X_test.reshape(10000, 784)\n",
    "X_train = X_train.astype('float32')\n",
    "X_test = X_test.astype('float32')\n",
    "X_train /= 255\n",
    "X_test /= 255\n",
    "print(\"Training matrix shape\", X_train.shape)\n",
    "print(\"Testing matrix shape\", X_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Modify the target matrices to be in the one-hot format, i.e.\n",
    "\n",
    "```\n",
    "0 -> [1, 0, 0, 0, 0, 0, 0, 0, 0]\n",
    "1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0]\n",
    "2 -> [0, 0, 1, 0, 0, 0, 0, 0, 0]\n",
    "etc.\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "Y_train = np_utils.to_categorical(y_train, nb_classes)\n",
    "Y_test = np_utils.to_categorical(y_test, nb_classes)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Build the neural network\n",
    "Build the neural-network. Here we'll do a simple 3 layer fully connected network.\n",
    "<img src=\"figure.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = Sequential()\n",
    "model.add(Dense(512, input_shape=(784,)))\n",
    "model.add(Activation('relu')) # An \"activation\" is just a non-linear function applied to the output\n",
    "                              # of the layer above. Here, with a \"rectified linear unit\",\n",
    "                              # we clamp all values below 0 to 0.\n",
    "                           \n",
    "model.add(Dropout(0.2))   # Dropout helps protect the model from memorizing or \"overfitting\" the training data\n",
    "model.add(Dense(512))\n",
    "model.add(Activation('relu'))\n",
    "model.add(Dropout(0.2))\n",
    "model.add(Dense(10))\n",
    "model.add(Activation('softmax')) # This special \"softmax\" activation among other things,\n",
    "                                 # ensures the output is a valid probaility distribution, that is\n",
    "                                 # that its values are all non-negative and sum to 1."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compile the model\n",
    "Keras is built on top of Theano (and now TensorFlow as well), both packages that allow you to define a *computation graph* in Python, which they then compile and run efficiently on the CPU or GPU without the overhead of the Python interpreter.\n",
    "\n",
    "When compiing a model, Keras asks you to specify your **loss function** and your **optimizer**. The loss function we'll use here is called *categorical crossentropy*, and is a loss function well-suited to comparing two probability distributions.\n",
    "\n",
    "Here our predictions are probability distributions across the ten different digits (e.g. \"we're 80% confident this image is a 3, 10% sure it's an 8, 5% it's a 2, etc.\"), and the target is a probability distribution with 100% for the correct category, and 0 for everything else. The cross-entropy is a measure of how different your predicted distribution is from the target distribution. [More detail at Wikipedia](https://en.wikipedia.org/wiki/Cross_entropy)\n",
    "\n",
    "The optimizer helps determine how quickly the model learns, how resistent it is to getting \"stuck\" or \"blowing up\". We won't discuss this in too much detail, but \"adam\" is often a good choice (developed here at U of T)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss='categorical_crossentropy', optimizer='adam')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the model!\n",
    "This is the fun part: you can feed the training data loaded in earlier into this model and it will learn to classify digits"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "原来的程序是旧版，修改了一下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/4\n"
     ]
    },
    {
     "ename": "InternalError",
     "evalue": " Blas GEMM launch failed : a.shape=(128, 784), b.shape=(784, 512), m=128, n=512, k=784\n\t [[node dense_1/MatMul (defined at D:\\Anaconda3\\lib\\site-packages\\keras\\backend\\tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_1033]\n\nFunction call stack:\nkeras_scratch_graph\n",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mInternalError\u001b[0m                             Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-9-bdf10201246c>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      2\u001b[0m           \u001b[0mbatch_size\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m128\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mepochs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m           \u001b[0mverbose\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m           validation_data=(X_test, Y_test))\n\u001b[0m",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\keras\\engine\\training.py\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)\u001b[0m\n\u001b[0;32m   1237\u001b[0m                                         \u001b[0msteps_per_epoch\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1238\u001b[0m                                         \u001b[0mvalidation_steps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1239\u001b[1;33m                                         validation_freq=validation_freq)\n\u001b[0m\u001b[0;32m   1240\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1241\u001b[0m     def evaluate(self,\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\keras\\engine\\training_arrays.py\u001b[0m in \u001b[0;36mfit_loop\u001b[1;34m(model, fit_function, fit_inputs, out_labels, batch_size, epochs, verbose, callbacks, val_function, val_inputs, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq)\u001b[0m\n\u001b[0;32m    194\u001b[0m                     \u001b[0mins_batch\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    195\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 196\u001b[1;33m                 \u001b[0mouts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfit_function\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    197\u001b[0m                 \u001b[0mouts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mto_list\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    198\u001b[0m                 \u001b[1;32mfor\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mo\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mout_labels\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mouts\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\tensorflow_core\\python\\keras\\backend.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, inputs)\u001b[0m\n\u001b[0;32m   3725\u001b[0m         \u001b[0mvalue\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmath_ops\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcast\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtensor\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3726\u001b[0m       \u001b[0mconverted_inputs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3727\u001b[1;33m     \u001b[0moutputs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_graph_fn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mconverted_inputs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   3728\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3729\u001b[0m     \u001b[1;31m# EagerTensor.numpy() will often make a copy to ensure memory safety.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\tensorflow_core\\python\\eager\\function.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m   1549\u001b[0m       \u001b[0mTypeError\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mFor\u001b[0m \u001b[0minvalid\u001b[0m \u001b[0mpositional\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mkeyword\u001b[0m \u001b[0margument\u001b[0m \u001b[0mcombinations\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1550\u001b[0m     \"\"\"\n\u001b[1;32m-> 1551\u001b[1;33m     \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_call_impl\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1552\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1553\u001b[0m   \u001b[1;32mdef\u001b[0m \u001b[0m_call_impl\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcancellation_manager\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\tensorflow_core\\python\\eager\\function.py\u001b[0m in \u001b[0;36m_call_impl\u001b[1;34m(self, args, kwargs, cancellation_manager)\u001b[0m\n\u001b[0;32m   1589\u001b[0m       raise TypeError(\"Keyword arguments {} unknown. Expected {}.\".format(\n\u001b[0;32m   1590\u001b[0m           list(kwargs.keys()), list(self._arg_keywords)))\n\u001b[1;32m-> 1591\u001b[1;33m     \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_call_flat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcaptured_inputs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcancellation_manager\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1592\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1593\u001b[0m   \u001b[1;32mdef\u001b[0m \u001b[0m_filtered_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\tensorflow_core\\python\\eager\\function.py\u001b[0m in \u001b[0;36m_call_flat\u001b[1;34m(self, args, captured_inputs, cancellation_manager)\u001b[0m\n\u001b[0;32m   1690\u001b[0m       \u001b[1;31m# No tape is watching; skip to running the function.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1691\u001b[0m       return self._build_call_outputs(self._inference_function.call(\n\u001b[1;32m-> 1692\u001b[1;33m           ctx, args, cancellation_manager=cancellation_manager))\n\u001b[0m\u001b[0;32m   1693\u001b[0m     forward_backward = self._select_forward_and_backward_functions(\n\u001b[0;32m   1694\u001b[0m         \u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\tensorflow_core\\python\\eager\\function.py\u001b[0m in \u001b[0;36mcall\u001b[1;34m(self, ctx, args, cancellation_manager)\u001b[0m\n\u001b[0;32m    543\u001b[0m               \u001b[0minputs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    544\u001b[0m               \u001b[0mattrs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"executor_type\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexecutor_type\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"config_proto\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconfig\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 545\u001b[1;33m               ctx=ctx)\n\u001b[0m\u001b[0;32m    546\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    547\u001b[0m           outputs = execute.execute_with_cancellation(\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\tensorflow_core\\python\\eager\\execute.py\u001b[0m in \u001b[0;36mquick_execute\u001b[1;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[0;32m     65\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     66\u001b[0m       \u001b[0mmessage\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 67\u001b[1;33m     \u001b[0msix\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mraise_from\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcore\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_status_to_exception\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcode\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmessage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     68\u001b[0m   \u001b[1;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     69\u001b[0m     keras_symbolic_tensors = [\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\six.py\u001b[0m in \u001b[0;36mraise_from\u001b[1;34m(value, from_value)\u001b[0m\n",
      "\u001b[1;31mInternalError\u001b[0m:  Blas GEMM launch failed : a.shape=(128, 784), b.shape=(784, 512), m=128, n=512, k=784\n\t [[node dense_1/MatMul (defined at D:\\Anaconda3\\lib\\site-packages\\keras\\backend\\tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_1033]\n\nFunction call stack:\nkeras_scratch_graph\n"
     ]
    }
   ],
   "source": [
    "model.fit(X_train, Y_train,\n",
    "          batch_size=128, epochs=4,\n",
    "          verbose=1,\n",
    "          validation_data=(X_test, Y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Finally, evaluate its performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test score: 0.06407171507249586\n"
     ]
    }
   ],
   "source": [
    "score = model.evaluate(X_test, Y_test,\n",
    "                       verbose=0)\n",
    "print('Test score:', score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Inspecting the output\n",
    "\n",
    "It's always a good idea to inspect the output and make sure everything looks sane. Here we'll look at some examples it gets right, and some examples it gets wrong."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# The predict_classes function outputs the highest probability class\n",
    "# according to the trained classifier for each input example.\n",
    "predicted_classes = model.predict_classes(X_test)\n",
    "\n",
    "# Check which items we got right / wrong\n",
    "correct_indices = np.nonzero(predicted_classes == y_test)[0]\n",
    "incorrect_indices = np.nonzero(predicted_classes != y_test)[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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paWvxZVe3ylTplQynUbjySefDOLu3bsHcboOli9fXtTyBgwYEMTNmzcvan7SNOywww5BvOGGGwZx+pqTjYX2pEREJFpqpEREJFpqpEREJFqNqk8qfV7UbrvtFsQzZswI4h133DGIe/XqFcSHHnpoEO+7775BvGDBgiDu1KlT5lwB1qxZE8RLliwJ4vT5O2nz588PYvVJlca8efNKOr8RI0YE8fbbb593/DfeeCNvLE3Tj3/84yBO12lj/f/XnpSIiERLjZSIiESrzkbKzMaa2WIzez/ntbZmNsnMZvm/bcqbpsROdSJZqE6kUOacyz+C2cHAauBe59wu/rVRwHLn3C1mNhJo45y7os6FmeVfWGTatAn/V9L3b5k6dWoQ77XXXgXNP33twI8++iiI031obdu2DeIhQ4YE8ejRowtafj1Mdc71rmlAU66TtH79+gXxww8/HMTp+0ktXrw4iNPnUb300kslzK4iVCclkD7Pc86cOUGc/rxIn0dVBWqtk1x17kk5514G0mcvngiM98/HA/0LTk8aFdWJZKE6kULV99d9WzjnFgE45xaZWfvaRjSzwcDgei5HqpvqRLJQnUityv4TdOfcGGAMNP7dc6k/1YlkoTppeurbSH1mZh38t54OwOI6p6hCn3/+eRC/8MILecd//vnni1reKaecEsTpPrH33nsviKvgWl1Nok7SevcOD7On+6DS0u9jFfZBFatJ1kldDjnkkLzD0+dVNlb1/Qn6RGCgfz4QeKI06UgjozqRLFQnUqssP0GfALwG9DCzhWZ2PnALcJSZzQKO8rE0YaoTyUJ1IoWq83Cfc+7MWgYdUeJcpIqpTiQL1YkUqlFdu6/atG8f/ojp7rvvDuL11gt3dK+77rogLva+RlIajz/+eBAfffTRece/9957g/inP/1pyXOS6rfrrrvmHZ6+n1xjpcsiiYhItNRIiYhItNRIiYhItNQn1YDS195r165dEKfP05o5c2bZc5K6pe/ztf/++wdxy5Ytg3jp0qVBfMMNNwTx6tWrS5idVKv0/erOPffcIH777beDeNKkSWXPKQbakxIRkWipkRIRkWipkRIRkWipT6qCDjjggCAeOXJk3vH79w/vWPD+++/XMqZU0qOPPhrEm222Wd7x77///iD++OOPS56TVL8jjzwyiNP3j3v22WeDOH0/usZKe1IiIhItNVIi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55Ylr6w22WSTID744IOD+Nlnnw3i7777ruw5iUh5HHfccUF8wgknBPGhhx4axN27dy9o/uk+pi5dugRxy5Yt807frFmzgpaXlfakREQkWmqkREQkWmqkREQkWk2qTyp9HsH06eGNP9N9PJ999lkQx9YHNXXq1CBu165dEO+5555BPHv27PIk1sT94Ac/COKbb745iHfZZZcgPvLII4NYfYVNU7du3YJ4yJAhQXzBBRcEcevWrYPYzEqaz/bbb1/S+ZWK9qRERCRaaqRERCRaaqRERCRajbpPavPNNw/iBx98MIjbtm0bxHfffXcQX3zxxeVJrJ5++tOfBvE222wTxBdeeGEQqw+qPM4+++wgvvHGG4O4U6dOeadP92EtW7asNIlJVdl6662DeNiwYRVd/ocffhjE6T76WGhPSkREoqVGSkREoqVGSkREotWo+6R69eoVxOlrW6Vdd911ZcymcDvvvHMQDx8+PIj/+Mc/BnG6z01KI9138Mtf/jKIN9tssyB2zuWd35133hnEQ4cODeLly5cXmqI0gHSfd7pP6a9//WsQp6+l+c9//jOIV65cGcRffvllEG+44YZB/NxzzwVx+n5Pb7zxRhC//fbbQfz111/nXV4stCclIiLRUiMlIiLRUiMlIiLRalR9Uun7Q51yyil5xz///PODeMmSJSXPqRDpPqi//OUvecdP90mtWrWq5DkJ/OhHPwri9Pl1hTrjjDOCuE+fPkGcPu8q3Yf17bffFrV8qZ+6+oR23333ID7ppJPyzu/1118P4nQfevpaoZ07dw7ihQsXBvH333+fd3nVSntSIiISLTVSIiISrTobKTMba2aLzez9nNfamtkkM5vl/7bJNw9p/FQnkoXqRApldZ3TYWYHA6uBe51zu/jXRgHLnXO3mNlIoI1z7oo6F2aWf2FFuu+++4L4P/7jP4I4ff+lQw45JIgb+jyBiy66KIjT1xIcN25cEJ933nnlTiltqnOud00DqqlO6tKlS5cgfvfdd4N4o402CuL33nsviNP3IUvfP6ouixcvDuKePXsG8aefflrQ/BpAo6iTFi1aBPHDDz8cxP369Qvim266KYjT9xX76quvSphdo1BrneSqc0/KOfcykD678ERgvH8+HuhfcHrSqKhOJAvViRSqvr/u28I5twjAObfIzNrXNqKZDQYG13M5Ut1UJ5KF6kRq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\n",
      "text/plain": [
       "<Figure size 504x504 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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Avg3gFYiskZELgMwAkAHEVkKoIPLVIaxTigK1gklK+HuPmNMz2IeOrWY+6kMYp1QFKwTSlZeX0+qWrVqKvvnYLv//vtV9scq/Ovy+PuAe/furXJBQYHKq1evVnnOnDkqL168uKhmU5r5x6f5Y4v+8SWff/55xtsUzwMPPKByz576fd2/rhDlpgEDBqh8yimnqDxr1iyVP/roI5X969edffbZcZfXqFEjlfN9TIqIiCjj2EkREVGw2EkREVGw8npM6uSTT1a5U6dOKvtjUo8//rjKq1atUrlSpUoqd+zYUeWpU6eqXK9ePZW3bdumsn8OOf+6QpQZf/vb31QeNWqUyuecc47K99xzT8bbFOurr75SeefOnSr7Y1L+WKmfd+3alcbWUUm1adNG5X794p84Y9y4cSrXrl1b5X/84x9x5/fHyNevX5+oiUHilhQREQWLnRQREQWLnRQREQUrr8akjj/+eJWfeOIJlS+88EKVp0+fntTz//TTTyr754TzLV++XOUTTjhBZf+4qS5dusR9nNLjP//5j8r+WOEll1yisn88iT92mSr/HJGDBulLKfljm74TTzxR5d/97ncq+8fbUGZUrFhRZX8M/KGHHlI50XXA/HN7+mPgBx10UNz5d+/erbI/Vlm5cmWVf/zxx7jPV1q4JUVERMFiJ0VERMFiJ0VERMESY7J33bBMX6TMH2vwj2vy991v3749qec/44wzVH7sscdU3rBhQ9zpjz32WJX947T8sYe2bduqHMC5/uYaY9pleiHZvphdorFL35o1a1R++OGHU1r+8OHDVd6zZ4/K//rXv1T2x8xOO+00lV9//XWVzz//fJVfeumlErUzCXlZJ77q1aur7I8h+WONofHPLdq3b1+VZ8yYkekmRKoTbkkREVGw2EkREVGw2EkREVGw8mpM6rnnnlP57bffVtm/Tk8ijRs3Vvn9999X2T9uyj9OK9G5slq0aKHyG2+8Eff5/evH+OcWzIK8HGvwj2858sgjVfbHGurUqZPW5X/88ccq33fffXGX/8MPP6jsH/8ydOhQlcuV059FhwwZUqJ2JiEv68Qfgxo5cqTKl112Wdz5v/vuu7jz+8fr+dcRa9cuvavUP47z0UcfVdk/x2UGcEyKiIhyGzspIiIKFjspIiIKVl6NSfn7bP0xqquvvlrladOmqXzWWWep/Pe//13lHTt2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py8Fc40x7RJPlppM18mxxx6r8owZM1ResmSJypdffrnK119/vcr+8XXLly9PtYkp8Y/nefDBB1X2x9D866r5x4WVQF7USSI333yzykOHDk3r8/vHz40dO1Zl//3r/vvvV9m//tz333+vcqL3syyIVCfckiIiomCxkyIiomCxkyIiomDl1XFSP/30k8rjx49XuV8/ffJk/3iR2bNnq/zGG2+o7O/j9fnHoyQag/Kv43P77bfHnZ7Swx9j2nvvvVV+6qmnVJ47d67K/phOaPzjrEJvb6568sknVfbHePz13rp165SW98c//jHu41deeWXcxydNmqTynXfeqfLnn39esoZlGLekiIgoWOykiIgoWOykiIgoWHl1nJTvqKOOUnnkyJEqn3DCCdlszq9k4PiUTMvJ41/++te/quwf3/Lvf/9bZf86YAEcTxLXbbfdpvKgQYNUHjNmjMr+9aZ2796tsn/8TQnkZJ1km39uUf/4veOOO07ldL9f+cdhPfvssyr7x4n+/e9/T+vyweOkiIgo17GTIiKiYLGTIiKiYOX1mJTPPy6qevXqKl9xxRUq++fOW716tcr+Plt/n/KZZ54Ztz3z589X+f/+7/9U9o/7CkBOjjX4193xa96/PtPJJ5+czsWn3fDhw1Xu0KGDytOnT1f5tddeU/k///lPZhr2i5ysk9D45wKtXLmyyjfeeKPKRxxxhMqJ3n8S8a+35491PvDAAyk9PzgmRUREuY6dFBERBYudFBERBatMjUllmr+v/+ijj05qfv86QP71XwKQk2MNfo37Y1SffPKJyp07d1Z5/fr16WxOQu3a6VXsj5X+4Q9/ULmgoEBlf0ytFK5vlZN1kuuqVq2qcs2aNVVu2LChyv5xUY0aNUpqeeXLl09q+iJwTIqIiHIbOykiIgoWOykiIgpWXl1PKtf4x7v4xyVQeiQad23btq3KEyZMULlnz54qb9myJaX2/OY3v1G5e/fuKvvHv7zyyisq33rrrSr7x3mVwhgUBWDnzp1xc7NmzVT2xzKTHZPKFm5JERFRsNhJERFRsNhJERFRsDgmlQL/eBb/+lWJPP/88yr713fZf//9Vf7666+Ten6yvvzyS5X99eofn3baaaepPGnSJJWvvPJKle+55x6VW7RoEbc9++67r8qjR49W+cgjj1TZHztIdUyMSsa/3tsf//hHlRcuXKjy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\n",
      "text/plain": [
       "<Figure size 504x504 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "for i, correct in enumerate(correct_indices[:9]):\n",
    "    plt.subplot(3,3,i+1)\n",
    "    plt.imshow(X_test[correct].reshape(28,28), cmap='gray', interpolation='none')\n",
    "    plt.title(\"Predicted {}, Class {}\".format(predicted_classes[correct], y_test[correct]))\n",
    "    \n",
    "plt.figure()\n",
    "for i, incorrect in enumerate(incorrect_indices[:9]):\n",
    "    plt.subplot(3,3,i+1)\n",
    "    plt.imshow(X_test[incorrect].reshape(28,28), cmap='gray', interpolation='none')\n",
    "    plt.title(\"Predicted {}, Class {}\".format(predicted_classes[incorrect], y_test[incorrect]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# That's all!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are lots of other great examples at the Keras homepage at http://keras.io and in the source code at https://github.com/fchollet/keras"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
